package 反射;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class 测试类 {
    @Test
    public void 获取造器() {
        Class 类类 = 类.class;
//        这个只能拿到公开构造函数
        Constructor[] 构造器 = 类类.getConstructors();
        for (Constructor c : 构造器) {
            System.out.println(c + "" + c.getParameterCount());
        }
//        这个能拿到所有构造函数
        Constructor[] 所有构造器 = 类类.getDeclaredConstructors();
        for (Constructor c : 所有构造器) {
            System.out.println(c + "" + c.getParameterCount());
        }
    }

    @Test
    public void 获取单个构造器() throws Exception {
        Class 类类 = 类.class;
        类类.getDeclaredConstructor(String.class);
    }

    @Test
    public void 利用构造器创建对象() throws Exception {
        Class 类类 = 类.class;
        Constructor 构造器 = 类类.getDeclaredConstructor(String.class);
        //构造器.setAccessible(true);这句话可以无视私有或者保护权限的关键词,统统可以调用
        类 类1 = (类) 构造器.newInstance("ygu");
        System.out.println(类1);
    }

    @Test
    public void 获取成员() throws Exception {
        Class 类类 = 类.class;
        Field[] 成员数组 = 类类.getDeclaredFields();
        for (Field 成员 : 成员数组) {
            System.out.println(成员);
        }
        Field 成员 = 类类.getDeclaredField("name");
        System.out.println(成员);
        类 类1 = new 类("喵喵喵");
        System.out.println(类1);
        成员.setAccessible(true);
        成员.set(类1, "啊我死了");
        System.out.println(类1);
    }

    @Test
    public void 获取方法() throws Exception {
        Class 类类 = 类.class;
        Method[] 方法数组 = 类类.getDeclaredMethods();
        for (Method 方法 : 方法数组) {
            System.out.println(方法 + "  " + 方法.getParameterCount() + "  " + 方法.getReturnType());
        }
        Method 方法 = 类类.getDeclaredMethod("f");
        方法.setAccessible(true);
        类 类1 = new 类();
        方法.invoke(类1);
    }
}
